export const items = [
{ name: "Laptop", price: 1200 },
{ name: "Smartphone", price: 800 },
{ name: "Tablet", price: 600 },
{ name: "Monitor", price: 300 },
];
export const SortByName = (a, b) => {
return a.name.localeCompare(b.name);
};
export const SortByPriceAscending = (a, b) => {
return a.price - b.price;
};
export const SortByPriceDescending = (a, b) => {
return b.price - a.price;
};
export const FilterByPriceAbove = (minPrice) => (item) => {
return item.price > minPrice;
};
<template>
<div>
<div>
<button @click="setSortStrategy(SortByName)">Sorteer op Naam</button>
<button @click="setSortStrategy(SortByPriceAscending)">Sorteer op Prijs (Laag naar Hoog)</button>
<button @click="setSortStrategy(SortByPriceDescending)">Sorteer op Prijs (Hoog naar Laag)</button>
<button @click="setFilterStrategy(FilterByPriceAbove(500))">Filter: Prijs > 500</button>
</div>
<ul>
<li v-for="item in sortedAndFilteredItems" :key="item.name">
{{ item.name }} - €{{ item.price }}
</li>
</ul>
</div>
</template>
<script>
import { ref, computed } from "vue";
import { items } from "@/data/items";
import { SortByName, SortByPriceAscending, SortByPriceDescending } from "@/strategies/SortStrategies";
import { FilterByPriceAbove } from "@/strategies/FilterStrategies";
export default {
setup() {
const itemList = ref(items);
const sortStrategy = ref(SortByName);
const filterStrategy = ref(null);
const sortedAndFilteredItems = computed(() => {
let filteredItems = filterStrategy.value
? itemList.value.filter(filterStrategy.value)
: itemList.value;
return [...filteredItems].sort(sortStrategy.value);
});
const setSortStrategy = (strategy) => {
sortStrategy.value = strategy;
};
const setFilterStrategy = (strategy) => {
filterStrategy.value = strategy;
};
return {
sortedAndFilteredItems,
setSortStrategy,
setFilterStrategy,
};
},
};
</script>
<style scoped>
</style>